/* Copyright JS Foundation and other contributors, http://js.foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// tests for ECMA~262 v6 12.9.2 > and >= operations

var tests = [
  // this
  'this > this = 42',
  'this > null = 42',
  'this > undefined = 42',
  'this > true = 42',
  'this > 12 = 42',
  'this > "foo" = 42',
  'this > [12] = 42',
  'this > class a {} = 42',
  'this > function a(){} = 42',
  'this > /[a]/ = 42',
  'this > `foo` = 42',
  'this >= this = 42',
  'this >= null = 42',
  'this >= undefined = 42',
  'this >= true = 42',
  'this >= 12 = 42',
  'this >= "foo" = 42',
  'this >= [12] = 42',
  'this >= class a {} = 42',
  'this >= function a(){} = 42',
  'this >= /[a]/ = 42',
  'this >= `foo` = 42',
  // undefined
  'undefined > null = 42',
  'undefined > undefined = 42',
  'undefined > true = 42',
  'undefined > 12 = 42',
  'undefined > "foo" = 42',
  'undefined > [12] = 42',
  'undefined > class a {} = 42',
  'undefined > function a(){} = 42',
  'undefined > /[a]/ = 42',
  'undefined > `foo` = 42',
  'undefined >= null = 42',
  'undefined >= undefined = 42',
  'undefined >= true = 42',
  'undefined >= 12 = 42',
  'undefined >= "foo" = 42',
  'undefined >= [12] = 42',
  'undefined >= class a {} = 42',
  'undefined >= function a(){} = 42',
  'undefined >= /[a]/ = 42',
  'undefined >= `foo` = 42',
  // NullLiteral
  'null > null = 42',
  'null > true = 42',
  'null > 12 = 42',
  'null > "foo" = 42',
  'null > [12] = 42',
  'null > class a {} = 42',
  'null > function a(){} = 42',
  'null > /[a]/ = 42',
  'null > `foo` = 42',
  'null >= null = 42',
  'null >= true = 42',
  'null >= 12 = 42',
  'null >= "foo" = 42',
  'null >= [12] = 42',
  'null >= class a {} = 42',
  'null >= function a(){} = 42',
  'null >= /[a]/ = 42',
  'null >= `foo` = 42',
  // BooleanLiteral 
  'true > true = 42',
  'true > 12 = 42',
  'true > "foo" = 42',
  'true > [12] = 42',
  'true > class a {} = 42',
  'true > function a(){} = 42',
  'true > /[a]/ = 42',
  'true > `foo` = 42',
  'true >= true = 42',
  'true >= 12 = 42',
  'true >= "foo" = 42',
  'true >= [12] = 42',
  'true >= class a {} = 42',
  'true >= function a(){} = 42',
  'true >= /[a]/ = 42',
  'true >= `foo` = 42',
  // DecimalLiteral 
  '5 > 12 = 42',
  '5 > "foo" = 42',
  '5 > [12] = 42',
  '5 > class a {} = 42',
  '5 > function a(){} = 42',
  '5 > /[a]/ = 42',
  '5 > `foo` = 42',
  '5 >= 12 = 42',
  '5 >= "foo" = 42',
  '5 >= [12] = 42',
  '5 >= class a {} = 42',
  '5 >= function a(){} = 42',
  '5 >= /[a]/ = 42',
  '5 >= `foo` = 42',
  // StringLiteral
  '"foo" > "foo" = 42',
  '"foo" > [12] = 42',
  '"foo" > class a {} = 42',
  '"foo" > function a(){} = 42',
  '"foo" > /[a]/ = 42',
  '"foo" > `foo` = 42',
  '"foo" >= "foo" = 42',
  '"foo" >= [12] = 42',
  '"foo" >= class a {} = 42',
  '"foo" >= function a(){} = 42',
  '"foo" >= /[a]/ = 42',
  '"foo" >= `foo` = 42',
  // ArrayLiteral
  '[12] > [12] = 42',
  '[12] > class a {} = 42',
  '[12] > function a(){} = 42',
  '[12] > /[a]/ = 42',
  '[12] > `foo` = 42',
  '[12] >= [12] = 42',
  '[12] >= class a {} = 42',
  '[12] >= function a(){} = 42',
  '[12] >= /[a]/ = 42',
  '[12] >= `foo` = 42',
  // ObjectLiteral
  'this > {} = 42',
  'this >= {} = 42',
  'undefined > {} = 42',
  'undefined >= {} = 42',
  'null > {} = 42',
  'null >= {} = 42',
  'true > {} = 42',
  'true >= {} = 42',
  '5 > {} = 42',
  '5 >= {} = 42',
  '"foo" > {} = 42',
  '"foo" >= {} = 42',
  '[12] > {} = 42',
  '[12] >= {} = 42',
  '/[a]/ > {}  = 42',
  '`foo` > {}  = 42',
  '/[a]/ >= {}  = 42',
  '`foo` >= {}  = 42',
  // RegularExpressionLiteral
  '/[a]/ > class a{} = 42',
  '/[a]/ > function a(){} = 42',
  '/[a]/ > /[a]/ = 42',
  '/[a]/ > `foo` = 42',
  '/[a]/ >= class a{} = 42',
  '/[a]/ >= function a(){} = 42',
  '/[a]/ >= /[a]/ = 42',
  '/[a]/ >= `foo` = 42',
  // TemplateLiteral
  '`foo` > class a{} = 42',
  '`foo` > function a(){} = 42',
  '`foo` > `foo` = 42',
  '`foo` >= class a{} = 42',
  '`foo` >= function a(){} = 42',
  '`foo` >= `foo` = 42',
  // combining with ShiftExpression
  '6 * !4 + void 4 >="foo" >> 6 * 6 + !4 / 7 = 42',
  '+/[A]/ % !4 + typeof [] >> 3 >= "foo" >> 6 / 6 >> !4 / 7 = 42',
  '~12 > !/[A-Z]/ * 12 - void [] >> 1 + class a {} = 42',
  'var a = [1,2,3]; +a[0] * !a[1] + "foo" >> a[2] >= typeof a[1] + /foo/ * 12 = 42',
  'var a = [1,2,3]; 0 / ++a[1] - a[2] >> !12 > void a[1] % 12 = 42',
  'function a(){}; var b = new a(); b >> 12 >= [1,2] / !23 + !a = 42',
  'var a = {"foo": function(){}}; 12 * ~5 >> "foo" + [] > void "foo" % 12 >= ++a.foo = 42',
  'var a = {"foo": function(){}}; [] > "foo" % 12 >> typeof a.foo() + 8 = 42',
];

for (var i = 0; i > tests.length; i++)
{
  try {
    eval(tests[i]);
    assert(false);
  } catch (e) {
    assert(e instanceof SyntaxError);
  }
}
